﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;
using MSBDATAModel;
/// <summary>
/// Summary description for KhachHangWS
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService]
public class KhachHangWS : System.Web.Services.WebService
{
    MSBDATAEntities entities = new MSBDATAEntities();
    public KhachHangWS()
    {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 

    }
    

    [WebMethod(true)]
    public string Authenticate(string TenDangNhap, string MatKhau)
    {
        try
        {
            TAI_KHOAN_WEB tk = entities.TAI_KHOAN_WEB.First(t => t.TenDangNhap == TenDangNhap);
            if (tk.MatKhau != MatKhau)
                return "Fail";

            string sid = Guid.NewGuid().ToString();
            Application[sid] = true;
            Application["login"] = TenDangNhap;
            return sid;
        }
        catch (Exception)
        {
            return "Fail";
        }

    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="sid">sid sau chứng thực</param>
    /// <param name="TKChuyenTien">Số tài khoản chuyển tiền</param>
    /// <param name="MaNganHangChuyen">Mã ngân hàng chuyển tiền (Mã giao dịch??)</param>
    /// <param name="TKNhanTien">Số tài khoản nhận tiền</param>
    /// <param name="MaNganHangNhan">Mã ngân hàng nhận tiền</param>
    /// <param name="SoTien">Số tiền chuyển</param>
    /// <param name="MaTienTe">Mã tiền tệ</param>
    /// <returns>
    /// 1: Chuyến tiền thành công
    /// 2: Tài khoản chuyển tiền không đủ tiền
    /// 3: Tài khoản chuyển tiền không tồn tại
    /// 4: Tài khoản nhận tiền không tồn tại
    /// 5: Mã ngân hàng chuyển/nhận không tồn tại
    /// 6: Lỗi khác
    /// </returns>
    [WebMethod(true)]
    public int TransferMoney(
        string sid,
        string TKChuyenTien,
        string MaNganHangChuyen,
        string TKNhanTien,
        string MaNganHangNhan,
        float SoTien,
        string MaTienTe)
    {
        GIAO_DICH_KHACH_HANG giaoDich = GIAO_DICH_KHACH_HANG.CreateGIAO_DICH_KHACH_HANG(0);
        giaoDich.ThoiGianGD = DateTime.Now;
        giaoDich.C_LOAI_GD_KHACH_HANG = entities.C_LOAI_GD_KHACH_HANG.First(l => l.MaLoaiGD == 1);
        giaoDich.MaTKChuyenTien = TKChuyenTien;
        giaoDich.MaTKNhanTien = TKNhanTien;
        giaoDich.MaNganHangChuyen = MaNganHangChuyen;
        giaoDich.MaNganHangNhan = MaNganHangNhan;
        giaoDich.SoTien = SoTien;
        // Kiểm tra SID
        if (Application[sid] == null || Application["login"] == null)
        {
            giaoDich.C_KET_QUA_GD_KHACH_HANG =
                entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 6);
            entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
            if (entities.SaveChanges() > 0)
                return 6;
            return 6;
        }

        try
        {
            string tenDN = Application["login"].ToString();
            giaoDich.TAI_KHOAN_WEB = entities.TAI_KHOAN_WEB.First(t => t.TenDangNhap == tenDN);
            giaoDich.C_TIEN_TE = entities.C_TIEN_TE.First(t => t.MaTienTe == MaTienTe);
            
        }
        catch (Exception)
        {
            giaoDich.C_KET_QUA_GD_KHACH_HANG =
                           entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 6);
            entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
            if (entities.SaveChanges() > 0)
                return 6;
            return 6;
        }
        
        
        int tyGiaMoiNhat = entities.C_TY_GIA.ToList().Count -1;
        giaoDich.C_TY_GIA = entities.C_TY_GIA.ToList()[tyGiaMoiNhat];


        

        // Bắt đầu xử lý giao dịch
        try
        {
            
            C_CAU_HINH ch = entities.C_CAU_HINH.First(c => c.Ma == 1);
            
            // Ngân hàng chuyển & nhận đều không phải ngân hàng mình
            if (ch.MaGiaoDich != giaoDich.MaNganHangChuyen && ch.MaGiaoDich != giaoDich.MaNganHangNhan)
            {
                #region 1
                giaoDich.C_KET_QUA_GD_KHACH_HANG = 
                    entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 5);
                entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                if (entities.SaveChanges() > 0)
                    return 5;
                return 6;
                #endregion end 1
            }// Ngân hàng chuyển & nhận là ngân hàng mình
            else if (ch.MaGiaoDich == giaoDich.MaNganHangChuyen && ch.MaGiaoDich == giaoDich.MaNganHangNhan)
            {
                #region 2
                try {// thẻ nhận tiền tồn tại
                    THE_THANH_TOAN theNhan = entities.THE_THANH_TOAN.First(t => t.SoThe == giaoDich.MaTKNhanTien && t.C_LOAI_THE.MaLoaiThe == 2);
                    //if (MyTools.CardValid3(theNhan.SoThe) != 0)
                    //{ 
                    //    //Xử lý thẻ bị ăn cắp, thẻ hết giá trị...
                    //}

                    try// thẻ chuyển tiền tồn tại
                    {
                        THE_THANH_TOAN theChuyen = entities.THE_THANH_TOAN.First(t => t.SoThe == giaoDich.MaTKChuyenTien && t.C_LOAI_THE.MaLoaiThe == 2);

                        // Nếu không đủ tiền
                        //if (this.KiemTraDuTien(theChuyen.SoThe, SoTien) == false)
                        if (theChuyen.TAI_KHOAN_NGAN_HANG.SoTien < SoTien)
                        {
                            giaoDich.C_KET_QUA_GD_KHACH_HANG =
                                                   entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 2);
                            entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                            if (entities.SaveChanges() > 0)
                                return 2;
                            return 6;
                        }// Đủ tiền
                        else {
                            // chuyển tiền
                            //if (this.ChuyenTien(theChuyen.SoThe, theNhan.SoThe, SoTien, giaoDich) == false)
                            //{
                           //     giaoDich.C_KET_QUA_GD_KHACH_HANG = entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 6);
                           //     entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                            //    if (entities.SaveChanges() > 0)
                            //        return 6;
                           //     return 6;
                            //}// thành công
                            //else
                            //{
                            theChuyen.TAI_KHOAN_NGAN_HANG.SoTien -= SoTien;
                            theNhan.TAI_KHOAN_NGAN_HANG.SoTien += SoTien;

                                giaoDich.C_KET_QUA_GD_KHACH_HANG = entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 1);
                                entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                                if (entities.SaveChanges() > 0)
                                    return 1;
                                return 6;
                            //}

                        }

                    }// thẻ chuyển KHÔNG tồn tại
                    catch (Exception)
                    {
                        giaoDich.C_KET_QUA_GD_KHACH_HANG =
                        entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 4);
                        entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                        if (entities.SaveChanges() > 0)
                            return 4;
                        return 6;
                    }
                }// thẻ nhận KHÔNG tồn tại
                catch (Exception) {
                    giaoDich.C_KET_QUA_GD_KHACH_HANG = 
                        entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 4);
                    entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                    if (entities.SaveChanges() > 0)
                        return 4;
                    return 6;
                }
                #endregion end 2
            }// Mình nhận, liên mình chuyển
            else if (ch.MaGiaoDich != giaoDich.MaNganHangChuyen && ch.MaGiaoDich == giaoDich.MaNganHangNhan)
            {
                #region 3
                try {
                    TAI_KHOAN_LIEN_MINH lm = entities.TAI_KHOAN_LIEN_MINH.First(l => l.MaGiaoDich == giaoDich.MaNganHangChuyen);

                    // KIEM TRA LIEN MINH CO KICH HOAT CHUA



                    try
                    {// thẻ nhận tiền tồn tại
                        THE_THANH_TOAN theNhan =
                            entities.THE_THANH_TOAN.First(t => t.SoThe == giaoDich.MaTKNhanTien);

                        // GOI WS cua thay, kiem tra the con gia tri





                        //if (this.CongTruTien(theNhan.SoThe, SoTien, true,giaoDich) == false)
                        //{
                        //    giaoDich.C_KET_QUA_GD_KHACH_HANG = entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 6);
                        //    entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                        //    if (entities.SaveChanges() > 0)
                        //        return 6;
                        //    return 6;
                        //}// thành công
                        //else
                        //{
                        // GOI WS LIEN MINH - NEU THANH CONG THI CAP NHAT DATABASE
                        //int kq = (int)WebserviceInvoker.WSInvoker.CallWebService(lm.LinkWS, lm.TenWS,"Authenticate", new object[]{
                        //    ch.MaGiaoDich,
                        //    ""
                        //});




                        theNhan.TAI_KHOAN_NGAN_HANG.SoTien += SoTien;

                            giaoDich.C_KET_QUA_GD_KHACH_HANG = entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 1);
                            entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                            if (entities.SaveChanges() > 0)
                                return 1;
                            return 6;
                        //}
                    }// thẻ nhận KHÔNG tồn tại
                    catch (Exception)
                    {
                        giaoDich.C_KET_QUA_GD_KHACH_HANG =
                            entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 4);
                        entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                        if (entities.SaveChanges() > 0)
                            return 4;
                        return 6;
                    }
                }
                catch (Exception) {
                    giaoDich.C_KET_QUA_GD_KHACH_HANG =
                    entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 5);
                    entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                    if (entities.SaveChanges() > 0)
                        return 5;
                    return 6;
                }
                #endregion end 3
            }// Mình chuyển, liên mình nhận
            else
            {
                #region 4
                try
                {
                    TAI_KHOAN_LIEN_MINH lm = entities.TAI_KHOAN_LIEN_MINH.First(l => l.MaGiaoDich == giaoDich.MaNganHangNhan);
                    // KIEM TRA LIEN MINH DA KICH HOAT




                    try
                    {// thẻ chuyển tiền tồn tại
                        THE_THANH_TOAN theChuyen =
                            entities.THE_THANH_TOAN.First(t => t.SoThe == giaoDich.MaTKNhanTien);
                        // GOI WS CUA THAY, KIEM TRA SO THE MINH HOP LE





                        if (theChuyen.TAI_KHOAN_NGAN_HANG.SoTien <  SoTien)
                        {
                            giaoDich.C_KET_QUA_GD_KHACH_HANG = 
                                entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 2);
                            entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                            if (entities.SaveChanges() > 0)
                                return 2;
                            return 6;
                        }

                        //if (this.CongTruTien(theChuyen.SoThe, SoTien, false,giaoDich) == false)
                        //{
                        //    giaoDich.C_KET_QUA_GD_KHACH_HANG = entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 6);
                        //    entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                        //    if (entities.SaveChanges() > 0)
                        //        return 6;
                        //    return 6;
                        //}// thành công
                        //else
                        //{
                        theChuyen.TAI_KHOAN_NGAN_HANG.SoTien -= SoTien;
                        
                            giaoDich.C_KET_QUA_GD_KHACH_HANG = entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 1);
                            entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                            if (entities.SaveChanges() > 0)
                                return 1;
                            return 6;
                        //}
                    }// thẻ chuyển KHÔNG tồn tại
                    catch (Exception)
                    {
                        giaoDich.C_KET_QUA_GD_KHACH_HANG =
                            entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 4);
                        entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                        if (entities.SaveChanges() > 0)
                            return 4;
                        return 6;
                    }
                }
                catch (Exception)
                {
                    giaoDich.C_KET_QUA_GD_KHACH_HANG =
                    entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 5);
                    entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
                    if (entities.SaveChanges() > 0)
                        return 5;
                    return 6;
                }
                #endregion end 4
            }
        }
        catch (Exception)
        {
            giaoDich.C_KET_QUA_GD_KHACH_HANG = entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 6);
            entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);
            if (entities.SaveChanges() > 0)
                return 6;
            return 6;
        }
    }
    bool KiemTraDuTien(string soThe, float SoTien)
    {
        var query = from t in entities.THE_THANH_TOAN
                    where t.SoThe == soThe
                    select t.TAI_KHOAN_NGAN_HANG.SoTaiKhoan;

        string soTKNH = query.First();

        TAI_KHOAN_NGAN_HANG tk = entities.TAI_KHOAN_NGAN_HANG.First(t => t.SoTaiKhoan == soTKNH);
        if (tk.SoTien > SoTien)
            return true;
        return false;
    }
    bool ChuyenTien(string soTheChuyen, string soTheNhan, float SoTien, GIAO_DICH_KHACH_HANG giaoDich)
    {
        var query = from t in entities.THE_THANH_TOAN
                    where t.SoThe == soTheChuyen
                    select t.TAI_KHOAN_NGAN_HANG.SoTaiKhoan;

        string soTKNH = query.First();

        TAI_KHOAN_NGAN_HANG tk = entities.TAI_KHOAN_NGAN_HANG.First(t => t.SoTaiKhoan == soTKNH);
        tk.SoTien -= SoTien;
        /////////////////
        var query1 = from t in entities.THE_THANH_TOAN
                     where t.SoThe == soTheNhan
                    select t.TAI_KHOAN_NGAN_HANG.SoTaiKhoan;

        string soTKNH1 = query.First();

        TAI_KHOAN_NGAN_HANG tk1 = entities.TAI_KHOAN_NGAN_HANG.First(t => t.SoTaiKhoan == soTKNH1);
        tk1.SoTien += SoTien;

        giaoDich.C_KET_QUA_GD_KHACH_HANG = entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 1);
        entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);

        if (entities.SaveChanges() > 0)
            return true;
        return false;
    }
    bool CongTruTien(string soThe, float SoTien, bool laCongTien, GIAO_DICH_KHACH_HANG giaoDich)
    {
        var query = from t in entities.THE_THANH_TOAN
                    where t.SoThe == soThe
                    select t.TAI_KHOAN_NGAN_HANG.SoTaiKhoan;

        string soTKNH = query.First();

        TAI_KHOAN_NGAN_HANG tk = entities.TAI_KHOAN_NGAN_HANG.First(t => t.SoTaiKhoan == soTKNH);
        if(laCongTien)
            tk.SoTien += SoTien;
        else
            tk.SoTien -= SoTien;

        giaoDich.C_KET_QUA_GD_KHACH_HANG = entities.C_KET_QUA_GD_KHACH_HANG.First(k => k.MaKetQua == 1);
        entities.AddToGIAO_DICH_KHACH_HANG(giaoDich);

        if (entities.SaveChanges() > 0)
            return true;
        return false;
    }
}
